"""
需求：将腾讯新闻首页所有新闻都爬去到本地
思路：先爬网页，通过正则获取所有新闻链接，然后依次爬各新闻，并存储到本地
"""

"""
未解决的问题：
（1）去除重复链接
（2）腾讯新闻的处理方法，目前爬不了
（3）百度新闻的爬取方法
"""


"""
如果数量太少，可能存在很多问题：
1.（2017年原）腾讯新闻存在的问题
    1）有些通过框架加载进来的，有些是直接加载进来的
    2）初始页面是大写的"UTF-8",可以在源文件charset处查看
    
2.爬取的链接，信息隐藏在js文件中→→抓包（源码中找不到信息）！！！目前怀疑腾讯新闻是做了这样的处理


爬取（原）腾讯新闻首页所有新闻内容
1）爬取新闻网页
2）得到各新闻链接
3）爬取新闻链接
4）寻找有没有frame
5）若有frame，抓取frame下第三方网页，没有的话就直接抓取当前网页
"""


import urllib.request
import re

#腾讯新闻爬不了了，做了高级处理，拿百度开刀
#爬取百度新闻首页所有新闻内容
#url="https://news.qq.com/"

url="https://news.baidu.com/"
#方法1：使用build_opener()修改报头
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#安装为全局
urllib.request.install_opener(opener)

data=urllib.request.urlopen(url).read().decode('utf-8','ignore')#对于字符的encode和decode，如果加上ignore参数，表示在编码和解码时，忽略掉那些无法编码和解码的字符，会会停下来，继续处理
#print(len(data)),数量还是够多的
pat='<a href="(.*?)" mon="ct=1&amp;a=2&amp;'
all_link=re.compile(pat).findall(data)
#print(len(all_link)),成功！！！
for i in range(len(all_link)):
    this_link = all_link[i]
    urllib.request.urlretrieve(this_link, "C:\\Users\\DELL\\Desktop\\python操作文件夹\\新闻爬虫实战数据\\" + str(i) + ".html")

"""
#针对原腾讯网页代码
for i in range(len(all_link)):
    this_link=all_link[i]
    this_page=urllib.request.urlopen(this_link).read().decode('gb2312','ignore')
    pat2="<frame sre=(.*?)>"
    is_frame=re.compile(pat2).findall(this_page)
    #print(len(is_frame))
    if (len(isframe)==0)：
        #直接爬取
        urllib.request.retrieve(this_link,"C:\\Users\\DELL\\Desktop\\python操作文件夹\\新闻爬虫实战数据\\"+str(i)+".html")
    else:
        #得到frame的网址再爬
        flink=is_frame[0]
        urllib.request.retrieve(flink,"C:\\Users\\DELL\\Desktop\\python操作文件夹\\新闻爬虫实战数据\\"+str(i)+".html")        
"""